#include <iostream>
#include <hiredis/hiredis.h>
#include <mysql/mysql.h>
#include <string>

// MySQL连接信息
const char* MYSQL_HOST = "127.0.0.1";    // 使用IP地址而不是localhost
const char* MYSQL_USER = "app_user";
const char* MYSQL_PASS = "Aa123456#";    // 请确认这个密码是否正确
const char* MYSQL_DB = "test_db";
const unsigned int MYSQL_CONN_PORT = 3306;    // MySQL默认端口
const char* MYSQL_UNIX_SOCKET = nullptr; // 不使用socket连接

int main() {
    // 连接到 Redis 服务器（默认本地 6379 端口）
    redisContext *conn = redisConnect("127.0.0.1", 6379);
    if (conn == nullptr || conn->err) {
        std::cerr << "❌ 无法连接到 Redis 服务器: " 
                  << (conn ? conn->errstr : "内存分配失败") << std::endl;
        return 1;
    }
    std::cout << "✅ 成功连接到 Redis 服务器" << std::endl;

    // 写入数据
    redisReply *reply;
    reply = (redisReply*)redisCommand(conn, "SET name Bob");
    std::cout << "📝 写入数据: name -> Bob (状态: " 
              << (reply->type == REDIS_REPLY_STATUS ? reply->str : "失败") << ")" << std::endl;
    freeReplyObject(reply);

    // 读取数据
    reply = (redisReply*)redisCommand(conn, "GET name");
    if (reply->type == REDIS_REPLY_STRING) {
        std::cout << "📖 读取数据: name -> " << reply->str << std::endl;
    } else {
        std::cerr << "❌ 键 'name' 不存在或读取失败" << std::endl;
    }
    freeReplyObject(reply);

    // 设置带过期时间的键（10秒后自动删除）
    reply = (redisReply*)redisCommand(conn, "SETEX temp_data 10 Expire_after_10s");
    std::cout << "⏳ 设置键 'temp_data' 并在 10 秒后过期 (状态: " 
              << (reply->type == REDIS_REPLY_STATUS ? reply->str : "失败") << ")" << std::endl;
    freeReplyObject(reply);

    // 检查键是否存在
    reply = (redisReply*)redisCommand(conn, "EXISTS temp_data");
    if (reply->type == REDIS_REPLY_INTEGER) {
        std::cout << "🔍 键 'temp_data' " 
                  << (reply->integer ? "存在" : "不存在") << std::endl;
    }
    freeReplyObject(reply);

    // 关闭Redis连接
    redisFree(conn);

    // MySQL演示
    std::cout << "\n=== MySQL 演示 ===" << std::endl;

    // 初始化MySQL连接
    MYSQL *mysql = mysql_init(nullptr);
    if (!mysql) {
        std::cerr << "❌ MySQL初始化失败" << std::endl;
        return 1;
    }

    // 打印连接信息
    std::cout << "尝试连接MySQL..." << std::endl;
    std::cout << "主机: " << MYSQL_HOST << std::endl;
    std::cout << "用户: " << MYSQL_USER << std::endl;
    std::cout << "数据库: " << MYSQL_DB << std::endl;
    std::cout << "端口: " << MYSQL_CONN_PORT << std::endl;
    std::cout << "Socket: " << (MYSQL_UNIX_SOCKET ? MYSQL_UNIX_SOCKET : "nullptr") << std::endl;

    // 设置连接选项
    bool reconnect = true;
    mysql_options(mysql, MYSQL_OPT_RECONNECT, &reconnect);

    // 连接到MySQL服务器
    if (!mysql_real_connect(mysql, MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DB, 
                           MYSQL_CONN_PORT, MYSQL_UNIX_SOCKET, 0)) {
        std::cerr << "❌ 无法连接到MySQL服务器: " << mysql_error(mysql) << std::endl;
        std::cerr << "错误代码: " << mysql_errno(mysql) << std::endl;
        std::cerr << "请检查:" << std::endl;
        std::cerr << "1. MySQL服务器是否正在运行" << std::endl;
        std::cerr << "2. 用户名和密码是否正确" << std::endl;
        std::cerr << "3. 数据库 " << MYSQL_DB << " 是否存在" << std::endl;
        std::cerr << "4. MySQL是否允许TCP连接" << std::endl;
        std::cerr << "5. 防火墙是否允许3306端口" << std::endl;
        std::cerr << "6. 当前用户是否有权限访问MySQL" << std::endl;
        std::cerr << "7. 尝试使用以下命令连接: mysql -h " << MYSQL_HOST << " -u " << MYSQL_USER << " -p" << std::endl;
        mysql_close(mysql);
        return 1;
    }
    std::cout << "✅ 成功连接到MySQL服务器" << std::endl;

    // 连接成功后，检查表是否存在
    if (mysql_query(mysql, "SHOW TABLES LIKE 'users'")) {
        std::cerr << "❌ 查询表失败: " << mysql_error(mysql) << std::endl;
        mysql_close(mysql);
        return 1;
    }

    MYSQL_RES *result = mysql_store_result(mysql);
    if (!result) {
        std::cerr << "❌ 获取结果集失败: " << mysql_error(mysql) << std::endl;
        mysql_close(mysql);
        return 1;
    }

    if (mysql_num_rows(result) == 0) {
        std::cerr << "❌ users表不存在，请先创建表" << std::endl;
        std::cerr << "可以使用以下SQL创建表：" << std::endl;
        std::cerr << "CREATE TABLE users (" << std::endl;
        std::cerr << "    id INT AUTO_INCREMENT PRIMARY KEY," << std::endl;
        std::cerr << "    name VARCHAR(50)," << std::endl;
        std::cerr << "    age INT" << std::endl;
        std::cerr << ");" << std::endl;
        mysql_free_result(result);
        mysql_close(mysql);
        return 1;
    }

    mysql_free_result(result);
    std::cout << "✅ 成功连接到users表" << std::endl;

    // 插入测试数据
    const char* insert_query = "INSERT INTO users (name, age) VALUES ('Alice', 25)";
    if (mysql_query(mysql, insert_query)) {
        std::cerr << "❌ 插入数据失败: " << mysql_error(mysql) << std::endl;
        mysql_close(mysql);
        return 1;
    }
    std::cout << "✅ 成功插入数据" << std::endl;

    return 0;
}